package cn.iocoder.yudao.module.system.util;

import cn.hutool.core.util.StrUtil;
import lombok.extern.slf4j.Slf4j;
import net.sourceforge.pinyin4j.PinyinHelper;
import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;
import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
import net.sourceforge.pinyin4j.format.HanyuPinyinVCharType;
import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;

/**
 * 中文转拼音工具类
 * 使用pinyin4j库实现中文转拼音功能
 * 
 * @author 芋道源码
 */
@Slf4j
public class PinyinUtils {

    /**
     * 拼音输出格式配置
     */
    private static final HanyuPinyinOutputFormat FORMAT = new HanyuPinyinOutputFormat();

    static {
        // 配置拼音输出格式
        FORMAT.setCaseType(HanyuPinyinCaseType.LOWERCASE); // 小写
        FORMAT.setToneType(HanyuPinyinToneType.WITHOUT_TONE); // 不带声调
        FORMAT.setVCharType(HanyuPinyinVCharType.WITH_V); // 用v表示ü
    }

    /**
     * 将中文姓名转换为拼音
     * 
     * @param chineseName 中文姓名
     * @return 拼音字符串（小写，无空格）
     */
    public static String convertToPinyin(String chineseName) {
        if (StrUtil.isBlank(chineseName)) {
            return "";
        }

        StringBuilder pinyin = new StringBuilder();
        for (char c : chineseName.toCharArray()) {
            try {
                // 使用pinyin4j库转换中文字符
                String[] pinyinArray = PinyinHelper.toHanyuPinyinStringArray(c, FORMAT);
                if (pinyinArray != null && pinyinArray.length > 0) {
                    // 取第一个拼音（多音字取第一个）
                    pinyin.append(pinyinArray[0]);
                } else if (Character.isLetter(c)) {
                    // 如果是英文字母，直接添加
                    pinyin.append(Character.toLowerCase(c));
                } else if (Character.isDigit(c)) {
                    // 如果是数字，直接添加
                    pinyin.append(c);
                }
                // 忽略其他字符（符号等）
            } catch (BadHanyuPinyinOutputFormatCombination e) {
                log.warn("拼音转换失败，字符: {}", c, e);
                // 转换失败时，如果是英文字母或数字，直接添加
                if (Character.isLetterOrDigit(c)) {
                    pinyin.append(Character.toLowerCase(c));
                }
            }
        }

        return pinyin.toString();
    }

    /**
     * 生成用户名
     * 
     * @param studentName 学生姓名
     * @param classCode 班级编码
     * @return 用户名（拼音+班级编码）
     */
    public static String generateUsername(String studentName, String classCode) {
        String pinyin = convertToPinyin(studentName);
        if (StrUtil.isBlank(pinyin)) {
            // 如果拼音转换失败，使用默认前缀
            pinyin = "student";
        }
        
        if (StrUtil.isNotBlank(classCode)) {
            return pinyin + classCode;
        } else {
            return pinyin;
        }
    }

}
